Fundamentos de estadística para analítica de Datos.

Lectura 5: Descripción de datos categóricos.

Docente: Luis Andres Campos Maldonado.

Datos categóricos.

  • Moda.
  • Bar-plot.
  • Pie-plot.
rm(list = ls())
library(tidyverse)
library(plotly)
library(DT)

Exploración de datos categóricos.

Para datos categóricos, las proporciones simples o porcentajes cuentan la historia de los datos.

Palabras claves:

Moda: La categoría o valor que ocurre con más frecuencia en un conjunto de datos.

Valor esperado: Cuando las categorías se pueden asociar con un valor numérico, esto da un valor basado en la probabilidad de ocurrencia de una categoría.

Bar-plot: La frecuencia o proporción de cada categoría trazada como barras.

Pie-plot: La frecuencia o proporción de cada categoría representada como cuñas en un pastel.

Obtener un resumen de una variable binaria o una variable categórica con algunas categorías es algo bastante fácil: solo calculamos la proporción de 1s, o las proporciones de las categorías.

Bar-plot: Recordemos que los bar-plots son una herramienta visual común para mostrar una única variable categórica. Las categorías se enumeran en el eje \(x\) y las frecuencias o proporciones en el eje \(y\).

aptos <- read_csv('https://raw.githubusercontent.com/lacamposm/Fundamentos_Analitica/main/data/APARTAMENTOS.csv')
datatable(aptos)

Eliminamos columna no necesaria.

str(data.frame(aptos))
## 'data.frame':    694 obs. of  11 variables:
##  $ precio        : num  79 93 100 123 135 140 145 160 160 175 ...
##  $ mt2           : num  43.2 56.9 66.4 61.9 89.8 ...
##  $ ubicacion     : chr  "norte" "norte" "norte" "norte" ...
##  $ estrato       : num  3 2 3 2 4 3 3 3 4 4 ...
##  $ alcobas       : num  3 2 2 3 3 3 2 3 4 3 ...
##  $ banos         : num  1 1 2 2 2 2 2 2 2 2 ...
##  $ balcon        : chr  "si" "si" "no" "si" ...
##  $ parqueadero   : chr  "si" "si" "no" "si" ...
##  $ administracion: num  0.05 0.069 0 0.13 0 0.12 0.14 0.127 0 0.123 ...
##  $ avaluo        : num  14.9 27 15.7 27 39.6 ...
##  $ terminado     : chr  "no" "si" "no" "no" ...

Revisión de valores nulos:

apply(is.na(aptos), 2, sum)
##         precio            mt2      ubicacion        estrato        alcobas 
##              0              0              0              0              0 
##          banos         balcon    parqueadero administracion         avaluo 
##              0              0              0              0              0 
##      terminado 
##              0

Tabla de frecuencias:

## Tenemos información.
aptos %>% group_by(terminado) %>% 
  summarise(frecuencias = n()) %>%
  mutate(frec_porcent = frecuencias/sum(frecuencias)) %>%
  arrange(desc(frecuencias)) %>%
  mutate(across(frec_porcent, round, 3))
## # A tibble: 2 × 3
##   terminado frecuencias frec_porcent
##   <chr>           <int>        <dbl>
## 1 si                592        0.853
## 2 no                102        0.147

Un bar-plot de la variable ubicacion:

Por ejemplo, el plot anterior muestra la cantidad de elementos en cada una de las ubicación de los apartamentos en cuestión.

El siguiente plot muestra el porcentaje de los apartamentos en la muestra que están o no terminados.

Nota: Tenga en cuenta que un bar-plot se parece a un histograma; en un bar-plot, el eje \(x\) representa diferentes categorías de una feature de tipo factor, mientras que en un histograma, el eje \(x\) representa valores de una sola variable en una escala numérica. Además, en un histograma, las barras normalmente se muestran tocándose entre sí, en un bar-plot, las barras se muestran separadas unas de otras. Finalmente, la conversión de datos numéricos a categóricos datos es un paso importante y ampliamente utilizado en el análisis de datos, ya que reduce la complejidad (y el tamaño) de los datos. Esto ayuda en el descubrimiento de las relaciones entre las características, en particular en las etapas iniciales de un análisis.

Moda

La moda es el valor, o valores en caso de empate, que aparece con mayor frecuencia en los datos. Por ejemplo, la moda de la ubicación en los apartamentos es ‘poblado’. Como otro ejemplo, en la mayor parte de Colombia, la moda de la preferencia religiosa sería católica. La moda es un resumen estadístico simple para datos categóricos, y generalmente no se usa para datos numéricos.

Valor esperado.

Un tipo especial de datos categóricos son los datos en los que las categorías representan o pueden asignarse a valores discretos en la misma escala. Un comercializador de una nueva tecnología en la nube, por ejemplo, ofrece dos niveles de servicio, uno a un precio de \(\$300/mes\) y otro a \(\$50/mes\). El comercializador ofrece seminarios web gratuitos para generar clientes potenciales, y las cifras que tiene la empresa deter,imam que el 5% de los asistentes se inscribirá en el servicio de \(\$300\), el \(15\%\) se inscribirá en el servicio de $50 servicio, y el 80% no se suscribirá a nada. Estos datos se pueden resumir, para fines financieros, en un único “valor esperado”, que es una forma de media ponderada, en la que los pesos son probabilidades.

El valor esperado se calcula de la siguiente manera:

  1. Multiplica cada resultado por su probabilidad de ocurrencia.
  2. Sume estos valores.

En el ejemplo del servicio en la nube, el valor esperado de un asistente al seminario web es, por lo tanto, \(\$22,50\) por mes, calculado de la siguiente manera: \[EV=(0.05)(300)+(0.15)(50)+(0.80)(0)=22.5\]

El valor esperado es realmente una forma de media ponderada: agrega las ideas de futuras expectativas y pesos de probabilidad, a menudo basados ​​en juicios subjetivos. El valor esperado es un concepto fundamental en la valoración de empresas y el presupuesto de capital, por ejemplo, el valor esperado de cinco años de ganancias de una nueva adquisición, o el ahorros de costos esperados del nuevo software de gestión de pacientes en una clínica.

Probabilidad.

Nos referimos anteriormente a la probabilidad de que ocurra un valor. La mayoría de las personas tienen una comprensión intuitiva de la probabilidad y se encuentran con el concepto con frecuencia, pronósticos (la probabilidad de lluvia) o análisis deportivos (la probabilidad de ganar). Por ejemplo si la probabilidades de que un equipo gane es 2 a 1, su probabilidad de ganar es 2/(2+1)= 2/3. Un primer concepto puede ser: la probabilidad de que ocurra un evento es la proporción de veces que ocurrirá si la situación podría repetirse una y otra vez, innumerables veces. La mayoría de las veces se trata de una construcción imaginaria, pero es una comprensión operativa adecuada de la probabilidad.

Ejemplo 1.

Vamos a generar un reporte de la tabla APARTAMENTOS.csv.

Una vista general del dataframe muestra lo siguiente:

## # A tibble: 5 × 11
##   precio   mt2 ubicacion     estrato alcobas banos balcon parqu…¹ admin…² avaluo
##    <dbl> <dbl> <chr>           <dbl>   <dbl> <dbl> <chr>  <chr>     <dbl>  <dbl>
## 1   1100   500 poblado             6       3     3 si     si        1.6     713.
## 2    260   137 belen guayab…       4       3     4 si     si        0.297   150 
## 3    600   156 poblado             6       3     4 no     si        0.535   451 
## 4    235    87 aburra sur          4       3     2 si     si        0.147    95 
## 5    498   253 poblado             6       3     3 si     si        0.532   405.
## # … with 1 more variable: terminado <chr>, and abbreviated variable names
## #   ¹​parqueadero, ²​administracion
## 'data.frame':    694 obs. of  11 variables:
##  $ precio        : num  79 93 100 123 135 140 145 160 160 175 ...
##  $ mt2           : num  43.2 56.9 66.4 61.9 89.8 ...
##  $ ubicacion     : chr  "norte" "norte" "norte" "norte" ...
##  $ estrato       : num  3 2 3 2 4 3 3 3 4 4 ...
##  $ alcobas       : num  3 2 2 3 3 3 2 3 4 3 ...
##  $ banos         : num  1 1 2 2 2 2 2 2 2 2 ...
##  $ balcon        : chr  "si" "si" "no" "si" ...
##  $ parqueadero   : chr  "si" "si" "no" "si" ...
##  $ administracion: num  0.05 0.069 0 0.13 0 0.12 0.14 0.127 0 0.123 ...
##  $ avaluo        : num  14.9 27 15.7 27 39.6 ...
##  $ terminado     : chr  "no" "si" "no" "no" ...

El dataset contiene 694 registros en 11 features, sin datos nulos. Tenemos al parecer 7 variables de tipo numérico y 4 character.

Recordemos que summary() genera un resumen estadístico básico del dataset:

summary(aptos)
##      precio            mt2         ubicacion            estrato     
##  Min.   :  25.0   Min.   : 26.0   Length:694         Min.   :2.000  
##  1st Qu.: 160.0   1st Qu.: 71.0   Class :character   1st Qu.:4.000  
##  Median : 245.0   Median : 97.5   Mode  :character   Median :5.000  
##  Mean   : 317.8   Mean   :120.9                      Mean   :4.651  
##  3rd Qu.: 380.0   3rd Qu.:141.8                      3rd Qu.:6.000  
##  Max.   :1700.0   Max.   :500.0                      Max.   :6.000  
##     alcobas           banos         balcon          parqueadero       
##  Min.   : 1.000   Min.   :1.00   Length:694         Length:694        
##  1st Qu.: 3.000   1st Qu.:2.00   Class :character   Class :character  
##  Median : 3.000   Median :2.00   Mode  :character   Mode  :character  
##  Mean   : 2.911   Mean   :2.29                                        
##  3rd Qu.: 3.000   3rd Qu.:3.00                                        
##  Max.   :14.000   Max.   :6.00                                        
##  administracion       avaluo          terminado        
##  Min.   :0.0000   Min.   :   0.149   Length:694        
##  1st Qu.:0.0900   1st Qu.:  73.000   Class :character  
##  Median :0.2010   Median : 131.431   Mode  :character  
##  Mean   :0.2636   Mean   : 182.637                     
##  3rd Qu.:0.3750   3rd Qu.: 234.051                     
##  Max.   :2.2800   Max.   :1540.620

Note que no tenemos ninguna vivienda de estrato 1. Además, tenemos propiedades de hasta 14 alcobas. El rango de los precios va desde 25 unidades monetatrias y hasta las 1700.

¿ Qué sucede con las variables que NO son de tipo numérico?

# aptos %>% select_if(is.character) %>% Seleccionar por tipo columna
aptos_1 <- aptos%>%mutate_if(is.character, as.factor)

Seleccionemos las variables solo de tipo categórico:

temp <- aptos_1 %>% select_if(is.factor)
summary(temp)
##           ubicacion   balcon   parqueadero terminado
##  aburra sur    :169   no:185   no:126      no:102   
##  belen guayabal: 67   si:509   si:568      si:592   
##  centro        : 38                                 
##  laureles      : 73                                 
##  norte         : 10                                 
##  occidente     : 69                                 
##  poblado       :268

El resumen anterior, muestra para cada feature categórica un pequeño resumen. Es este se muestran la cantidad de valores únicos en cada feature, así como la moda y la cantidad de ocurrencias de dicha moda. Note que aunque el estrato tiene ingresos numéricos, esta realmente se trabajada con una feature cualitativa ordinal.

## [1] "Conteo por estratos:"
##   summary(aptos$estrato)
## 2                      8
## 3                    161
## 4                    138
## 5                    145
## 6                    242

Veamos como se distribuyen los precios en la variable precio en el sector del poblado

aptos %>% filter(ubicacion == "poblado") %>%
  plot_ly(x = ~precio, type = "histogram", 
          marker = list(color = "rgb(100,50,100)",line = list(color = "skyblue", width = 1))) %>%
  layout( barmode="stack", bargap=0.02, title = "Distribución precios aptos: Sector poblado.", yaxis = list(title="Conteo"), template = "plotly_dark")

Ahora, en el sector del centro.

aptos %>% filter(ubicacion == "centro") %>%
  plot_ly(x = ~precio, nbinsx = 10, type = "histogram",
          marker = list(color = "rgb(100,50,50)", line = list(color = "skyblue", width = 1))) %>%
  layout(barmode="stack", bargap=0.02, title = "Distribución precios aptos: Sector centro", 
         yaxis = list(title="Conteo"), plot_bgcolor = "skyblue")

El plot anterior muestra que la distribución de precios es sesgada a la derecha, es decir la mayor parte de la información se concentra a la izquierda del plot.

Veamos ambos plots en uno solo:

aptos %>% filter(ubicacion %in% c("centro", "poblado")) %>%
  ggplot() +
  aes(precio, colour = ubicacion) +
  geom_density() + 
  xlim(0, 2500)

aptos %>% filter(ubicacion %in% c("centro", "poblado")) %>%
  ggplot() +
  aes(precio, colour = ubicacion) +
  geom_boxplot() + 
  theme(axis.ticks.y = element_blank(), axis.text.y = element_blank())

Más aún, podemos comparar la distribución de todas las ubicaciones:

ggplot(aptos) +
  aes(x = ubicacion, y = precio) + 
  geom_boxplot()

Las zonas del ‘poblado’ y ‘laureles’ son las más costosas, en contraste ‘centro’ y ‘norte’ las que tienen precios más bajos.

Conclusiones:

Exploramos la descripción de variables categóricas, se observó como estas puedes ser un factor para discriminar grupos y ser comparados.